package 临时软件包.ui;

import com.weiawei.Dialog.ExitDialog;
import com.weiawei.Model.Buttons;
import com.weiawei.Model.TimeThread;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MainBoard extends JFrame implements ActionListener, MouseListener, MouseMotionListener {
    //    关闭按钮和缩小化按钮
    private Buttons closeButton;
    private Buttons smallButton;
    //    导航栏
    private JLabel headLabel;
    //    窗口位置

    private Point position;
    //    标记是否可以点击
    public static final boolean CAN_CLICK = true;
    public static final boolean CAN_NOT_CLICK = false;
    //    计时器
    public TimeThread timeThread;
    public JLabel timeCountLabel;
    //    退出游戏对话框
    protected ExitDialog exitDialog;

    //    关闭图标
    private static final String[] closeIcons = {
            "images/close_icon.png", "images/close_pressed.png", "images/close_icon.png"
    };
    //    缩小图标
    private static final String[] smallIcons = {
            "images/small_icon.png", "images/small_pressed.png", "images/small_icon.png"
    };

    /**
     * MainBoard类的构造函数
     * <p>在MainBoard类的的构造函数中会对主界面的窗口样式进行初始化
     * 包括窗口的大小和显示位置，最小化和关闭按钮。
     * 生成的MainBoard实例大小不可以被更改</p>
     */
    public MainBoard() {
        this.init();
        //    窗口样式设置
        // 设置无边框模式
        setUndecorated(true);
        //无布局管理器，自设
        setLayout(null);
        //窗口大小不可改
        setResizable(false);
        //设置窗口默认关闭才做，点击窗口关闭按钮时推出
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        //设置窗口大小
        setBounds(500, 100, 800, 620);
        //设置窗口可见
        setVisible(true);
        //绘制背景
        paintBackground();
        // 向窗口添加鼠标监听器，监听当前窗口的所有鼠标相关事件
        addMouseListener(this);
    }

    /**
     * 主页面头部的初始化函数
     * 包括菜单栏的最小化按钮和关闭按钮
     * timeCountLabel为计时标签
     * 用headLabel填充其他空白区域
     */
    public void init() {
        closeButton = new Buttons(closeIcons, null);
        smallButton = new Buttons(smallIcons, null);

        headLabel = new JLabel();

        timeCountLabel = new JLabel();

        exitDialog = new ExitDialog(this, "退出游戏", true);

        closeButton.setBounds(770, 0, 30, 30);
        closeButton.addActionListener(this);
        closeButton.setBorderPainted(false);

        smallButton.setBounds(740, 0, 30, 30);
        smallButton.addActionListener(this);
        smallButton.setBorderPainted(false);

        timeCountLabel.setFont(new Font("Microsoft Yahei", Font.BOLD, 30));
        timeCountLabel.setBounds(640, 70, 230, 40);

        headLabel.setBounds(0, 0, 740, 30);
        headLabel.setBackground(new Color(72, 72, 72));
        headLabel.setOpaque(true);

        headLabel.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                super.mousePressed(e);
                position = new Point(e.getX(), e.getY());
                setCursor(new Cursor(Cursor.MOVE_CURSOR));
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
            }
        });
        headLabel.addMouseMotionListener(this);

        this.add(closeButton);
        this.add(smallButton);
        this.add(headLabel);
        this.add(timeCountLabel);
        this.repaint();
    }

    /**
     * 绘制菜单的背景图片
     * 图片使用images文件夹下的mainBoard.png
     * 图片大小和窗口等大，面板容器设置为透明
     */
    //TODO 下棋主界面的背景图调整
    public void paintBackground() {
        ImageIcon menuImage = new ImageIcon(this.getClass().getResource("/images/beijing2.jpg"));
        JLabel menuLabel = new JLabel(menuImage);
        //    添加图片并将其设置为窗口大小
        menuLabel.setBounds(0, 0, this.getWidth(), this.getHeight());
        //    将 menuLabel 置为容器最高层
        this.getLayeredPane().add(menuLabel, new Integer(Integer.MIN_VALUE));
        //    设置面板容器透明
        //    让棋盘图画覆盖上来
        JPanel menuPanel = (JPanel) this.getContentPane();
        menuPanel.setOpaque(false);
    }

    /**
     * 无限绘制，时刻刷新棋盘
     */
    public void paint(Graphics graphics) {
        super.paint(graphics);
        repaint();
    }

    /**
     * 设置按钮的样式
     *
     * @param button 需要设置样式的按钮
     */
    public void setButtonStyle(JButton button) {
        //设置按钮背景颜色
        button.setBackground(new Color(88, 87, 86));
        //禁用边框
        button.setFocusable(false);
        //设置字体
        button.setFont(new Font(Font.DIALOG, Font.BOLD, 20));
        //文本颜色
        button.setForeground(new Color(245, 245, 245));
        //监听器
        button.addActionListener(this);
    }

    /**
     * 为子类提供关闭按钮实例
     *
     * @return 窗口的关闭按钮
     */
    public Buttons getCloseButton() {
        return closeButton;
    }

    /**
     * 为子类提供缩小按钮实例
     *
     * @return 窗口的缩小按钮
     */
    public Buttons getSmallButton() {
        return smallButton;
    }

    /**
     * 为子类提供计时器实例
     *
     * @return 计时器
     */
    public TimeThread getTimeThread() {
        return timeThread;
    }

    /**
     * 为服务端和客户端提供计时标签实例
     *
     * @return 计时标签实例
     */
    public JLabel getTimeCountLabel() {
        return timeCountLabel;
    }

    /**
     * 设置计时器
     *
     * @param timeThread 计时器实例
     */
    public void setTimeThread(TimeThread timeThread) {
        this.timeThread = timeThread;
    }

    /**
     * 设置窗口的点击事件
     *
     * <p>当用户点击最小化按钮的时候会将窗口最小化
     * 当用户点击关闭按钮的时候会将窗口关闭</p>
     *
     * @param e 用户点击的按键
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == closeButton) {
            exitDialog.setVisible(true);
            if (exitDialog.getMessage() == ExitDialog.exit) {
                System.exit(0);
            }
        } else if (e.getSource() == smallButton) {
            setExtendedState(ICONIFIED);
        }
    }

    @Override
    public void mouseClicked(MouseEvent e) {

    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }


    /**
     * 设置窗口拖动事件
     *
     * 当用户点击菜单头部栏并拖动的时候会触发事件
     * 窗口会跟随用户的鼠标进行移动
     *
     * @param e 用户鼠标拖动事件
     */
    @Override
    public void mouseDragged(MouseEvent e) {
        Point newPosition = new Point(getLocation().x + e.getX() - position.x,
                getLocation().y + e.getY() - position.y);
        setLocation(newPosition.x, newPosition.y);
    }

    @Override
    public void mouseMoved(MouseEvent e) {

    }
}
